C++复习 extern C

  1. extern “C”
  2. 指向extern “C”函数的指针

extern “C”

  • extern “xxx”表示链接指示,用于c++调用其他语言编写的程序

    还要求c++编译器有权访问其他语言的编译器(包括c语言),并且兼容

还可以链接其他语言的程序比如 extern “Ada”

  • 被 extern 限定的函数或变量是 extern 类型的
  • extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的

extern "C" 的作用是让 C++ 编译器将 extern "C" 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。

- 符号修饰:[extern "C" 本质论——符号和符号修饰](https://blog.csdn.net/u011025903/article/details/11804587)

extern “C” 使用

#ifdef __cplusplus
//方式1
extern "C" {
#endif

void *memset(void *, int, size_t);

#ifdef __cplusplus
}
#endif


//方式2
extern "C" size_t strlen(const char *);
  • 当一个#include指示被放置在复合链接指示的花括号中,头文件中的所有普通函数声明都人未还是由链接指示的语言编写的。
extern "C" {
    #include <string.h>
}
  • 链接指示可以嵌套

指向extern “C”函数的指针

  • 使用链接指示定义的函数来说,它的每个声明都必须使用相同的链接指示
//pf指向一个C函数,该函数接受一个int返回void
extern "C" void (*pf)(int);
  • 指向C函数的指针与指向C++函数的指针是不一样的类型,不能用在初试化或赋值操作中
void (*pf1)(int); //指向c++函数
void "C" void (*pf2)(int); //指向C函数
pf1 = pf2;//error
  • 链接指示对整个声明都有效

    链接指示不仅对函数有效,而且对作为返回类型或形参类型的函数指针也有效

//f1是一个C函数,它的形参是一个指向C函数的指针
extern "C" void fl(void(*)(int));
  • 因为链接指示同时作用于声明语句中的所有函数,如果要给C++传入C函数指针,必须使用类型别名
//FC是一个指向C函数的指针
extern "C" typedef void FC(int);
//f2是一个C++函数,该函数的形参是指向C函数的指针
void f2(FC *);
  • 使用链接指示对函数进行定义,可以令C++函数在其他语言中调用

    但类型受到限制,比如c语言理解不了类

extern "C" double calc(double dparm)
{
    /*
    ...
    */
}
  • 链接指示对应的语言支持重载则可能可以重载

    c语言不支持重载,所以不能声明两个函数名相同的函数

extern "C" void print(const char*);

extern "C" void print(int);